const { resolve } = require('path')
const querystring = require('querystring')
const handleBlogRouter = require('./src/router/blog')
const handleUserRouter = require('./src/router/user')
const { get, set } = require('./src/data/redis')
const {access} = require('./src/util/log')
const {exec} = require('./src/data/mysql')

//所有的session数据
// const SESSION = {}
//sql插入
function insert(sql) {
    
}

const cookieExpires = () => {
    const date = new Date()
    date.setTime(date.getTime() + (24 * 60 * 60 * 1000))
    // console.log(date.toGMTString())
    return date.toGMTString()
}

//处理post数据，异步，在处理路由之前要解析完，所以用promise先拿数据再指定回调匹配路由
const getPostData = (req) => {
    const promise = new Promise((resolve,reject) => {
        //不是post方法
        if(req.method !== 'POST') {
            console.log('不是post方法是get方法resovle空对象')
            resolve({})
            return
        }
        //不是json格式的数据
        if(req.headers['content-type'] !== 'application/json;charset=UTF-8') {
            console.log('不是json格式的数据resovle空对象')
            resolve({})
            return
        }
        //接收请求数据
        let postData = ''
        req.on('data', chunk => {
            postData += chunk.toString()
        })
        req.on('end', () => {
            //没有数据就直接resovle空对象
            if(!postData) {
                console.log('没有数据就直接resovle空对象')
                resolve({})
                return
            }
            resolve(JSON.parse(postData))
        })


    })
    return promise
}



const serverHandle = (req, res) => {
    //记录日志
    access(`${req.method} -- ${req.url} -- ${req.headers['user-agent']} -- ${new Date().toGMTString()}`)

    // 设置返回格式 JSON
    res.setHeader('content-type', 'application/json;charset=UTF-8')

    //获取请求信息url\path\query
    const url = req.url //url
    req.path = url.split('?')[0] //path
    req.query = querystring.parse(url.split('?')[1])    
    

    //解析cookie
    req.cookie = {}
    const cookie = req.headers.cookie || ''
    cookie.split(';').forEach(item => {
        if(!item) {
            return
        }
        const arr = item.split('=')
        //拼接cookie会有空格所有去掉空格
        const key = arr[0].trim()
        const value = arr[1].trim()
        req.cookie[key] = value
    });
    // console.log(req.cookie)
    

    //解析session 如果有userid，并且SESSION也有了就直接复制，如果没有就
    let needSetCookie = false
    let userid = req.cookie.userid
    // if(userid) {
    //     if(!SESSION[userid]) {
    //         SESSION[userid] = {}
    //     }
    // }else {
    //     needSetCookie = true
    //     userid = `${Date.now()}_${Math.random()}`
    //     SESSION[userid] = {}
    // }
    //console.log(userid)
    if(!userid) {
        needSetCookie = true
        userid = `${Date.now()}_${Math.random()}`
        const sql = `insert into session(sessionId,username,realname) values('${userid}','','');`
        exec(sql).then(val => {
            //console.log(val)
        }) //sql插入
        // set(userid, {}) //redis插入
    }
    req.sessionId = userid
    exec(`select * from session where sessionId='${userid}';`).then(sessionData => {
       // console.log(sessionData[0])
        if (!sessionData) {
            // 初始化 redis 中的 session 值
            // set(req.sessionId, {})
            const sql = `insert into session(sessionId,username,realname) values('${userid}','','');`
        exec(sql).then(val => {
           // console.log(val)
            }) //sql插入
            // 设置 session
            req.session = {}
        } else {
            // 设置 session
            //console.log(req.body)
            req.session = sessionData[0]
            // console.log(req.session)
        }
      return   getPostData(req)

    })
    //redis的处理
    // get(req.sessionId).then(sessionData => {
    //     //如果没有找到
    //    // console.log(sessionData)
    //     if (sessionData) {
    //         // 初始化 redis 中的 session 值
    //         set(req.sessionId, {})
    //         // 设置 session
    //         req.session = {}
    //     } else {
    //         // 设置 session
    //         //console.log(req.body)
    //         req.session = sessionData
    //     }
    //   return   getPostData(req)
    // })//处理请求post数据
    .then(postData => {
        //在处理路由之前要解析完postData，然后所有的路由都可以过body使用postData
        req.body = postData
        
         //处理blog路由
        // const bolgData = handleBlogRouter(req,res)
        // //console.log(bolgData)
        // if(bolgData) {
        //     res.end(
        //         JSON.stringify(bolgData)
        //     )
        //     return
        // }

        const bolgResult = handleBlogRouter(req,res)
        if(bolgResult) {
            bolgResult.then(bolgData => {
                if(needSetCookie){
                    res.writeHead(200, {
                        "Set-Cookie":`userid=${userid};path=/;httpOnly;expires = ${cookieExpires()}`
                    })
                }
                res.end(JSON.stringify(bolgData))
            })
            return
        }
        
        //处理uesr路由
        // const userData = handleUserRouter(req,res)
        // if(userData) {
        //     res.end(
        //         JSON.stringify(userData)
        //     )
        //     return
        // }
       // console.log(req.body)
        const userResult = handleUserRouter(req,res)
        if(userResult) {
            userResult.then(userData => {
                //console.log(userData)
                if(needSetCookie){
                    res.writeHead(200, {
                        "Set-Cookie":`userid=${userid};path=/;httpOnly;expires = ${cookieExpires()}`
                    })
                }
                res.end(JSON.stringify(userData))
            })
            return
        }

        //没有命中路由，返回404
        res.writeHead(404, {"Content-type": "text/plain;charset=utf-8"})
        res.write('404 Not Found\n //路径或者方法不对')
        res.end()       
        })
        //query
        //测试数据
        // const resData =  {
        //     name: '吉吉',
        //     site:'mac',
        //     env: process.env.NODE_ENV
        // }
        // res.end(
        //     JSON.stringify(resData)
        // )
   
    
}

module.exports = serverHandle

// process.env.NODE_ENV



// const http = require('http')
// const querystring = require('querystring')

// const server = http.createServer((req,res) => {
//     const method = req.method
//     const url = req.url
//     const path =  url.split('?')[0]
//     const query = querystring.parse(url.split('?')[1])
//     //设置格式为JSON
//     res.setHeader('Content-type','application/json')
//     //返回的数据
//     const data = {
//        method,
//        url,
//        path,
//        query
//     }
//     if(method === 'GET') {
//         res.end(
//           JSON.stringify(data)
//         )
//     }
//     if(method === 'POST') {
//         let postData = ''
//         //接收数据   数据流的形式  每次有数据就触发，接收完之后就触发end事件结束
//         req.on('data', chunk => {
//             postData += chunk.toString()
//         })
//         req.on('end', () => {
//             data.postData = postData
//             // 返回
//             res.end(
//                 JSON.stringify(data)
//             )
//         })
//     }
       
    
// })
// server.listen(8000)
// console.log('listen8000 ok')
